import {defineStore} from 'pinia';
import workApi from "@/http/workApi";
import {uuid} from "@/hooks/uuid";
import {
    AiStatus, Api1, ApplicationWeb,
    Apps, ArrowAnnotation,
    Automatic, Calculation, CalendarHeatMap, Carbon, ChangeCatalog,
    ChartArea,
    ChartBar, ChartBubble,
    ChartClusterBar,
    ChartHistogram, ChartLine,
    ChartMultiLine,
    ChartPie,
    ChartRadar, ChartScatter, ChartTreemap, Compare,
    ContainerRegistry, DataBase,
    DataBlob, DataReference, DataSet,
    DataShare, DataTable, DistributeVerticalTop, Edit,
    Equalizer,
    FileStorage,
    GraphicalDataFlow, Insert, PauseFilled, PointerText,
    RowDelete,
    SearchLocate, SortDescending, SplitScreen, TextAnnotationToggle, TextHighlight, UserMilitary,
    WordCloud
} from "@vicons/carbon";
import {DataFunnel24Regular, ApprovalsApp20Regular, DataFunnel24Filled} from "@vicons/fluent"
import {PictureScore} from "@/components/VueFlowModel/Compositions";

export const useElementsStore = defineStore('elements', {
    actions: {
        updateElements(trainingId, taskId, mandatory = false) {
            // 从服务器获取节点信息
            if (!this.elements.length || mandatory) {
                // 数据为空或者开启强制更新
                workApi.get("perform_tasks/save", {
                    params: {
                        training_id: trainingId,
                        task_id: taskId
                    }
                }).then(r => {
                    this.elements = []
                    r.data.map(s => {
                        if (s.class === 'node') {
                            // 传入节点类型  获取节点模板
                            let template = this.getElementTemplate(s.type)
                            template.computedPosition = s.computedPosition
                            template.data = s.data
                            template.dimensions = s.dimensions
                            template.dragging = s.dragging
                            template.id = s.id
                            template.maxEntryNumber = s.maxEntryNumber
                            template.maxExportNumber = s.maxExportNumber
                            template.position = s.position
                            template.handleBounds = s.handleBounds
                            this.addElements(template)
                        } else {
                            this.addEdge(s)
                        }
                    })
                });
            }
        },
        saveElement(projectId, taskId) {
            // 保存到服务器
            workApi.post('perform_tasks/save', {
                data: this.elements,
                training_id: projectId,
                task_id: taskId
            })
        },
        emptiedElements() {
            // 清空画布
            window.$dialog.warning({
                title: '确定清除吗? (不影响存档)',
                content: '你确定？',
                positiveText: '确定',
                negativeText: '不确定',
                onPositiveClick: () => {
                    this.elements = []
                    window.$message.success('wow! 又是一张白白净净的纸了呢')
                },
                onNegativeClick: () => {
                    window.$message.info('虚惊一场, 还以为真的删呢')
                }
            })

        },
        addElements(value) {
            // 添加节点
            this.elements.push(value)
        },
        delNode(value) {
            value = {...value}
            // 删除节点
            for (let i = 0; i < this.elements.length; i++) {
                if (this.elements[i]['source'] === value.id || this.elements[i]['target'] === value.id) {
                    // 找到与节点有关的线  删除线
                    this.delEdge(this.elements[i])
                    i--
                } else if (this.elements[i].id === value.id) {
                    // 找到节点 删除节点
                    this.elements.splice(i, 1)
                    i--
                }
            }
        },
        addEdge(value) {
            // 判断是否已存在线
            for (let i of this.elements) {
                if (
                    i.id === value.id &&
                    i.sourceHandle === value.sourceHandle &&
                    i.targetHandle === value.targetHandle
                ) {
                    return false
                }
            }
            this.elements.push(value)
            return true
        },
        delEdge(value) {
            // 删除线
            for (let i in this.elements) {
                // 删除线 并对链接的节点最大链接数加1
                if (this.elements[i].id === value.id) {
                    // 删除线
                    this.elements.splice(+i, 1);
                } else if (this.elements[i].id === value['source']) {
                    // 源节点的柄连接数加1
                    this.elements[i].maxExportNumber++
                } else if (this.elements[i].id === value['target']) {
                    // 接入节点的柄连接数加1
                    this.elements[i].maxEntryNumber++
                }
            }

        },
        cloneData(aId, aKey, bId, bKey) {
            // 从节点A克隆数据到节点B
            let aNumber = -1
            let bNumber = -1
            for (let i in this.elements) {
                if (this.elements[i].id === aId) {
                    aNumber = i
                } else if (this.elements[i].id === bId) {
                    bNumber = i
                } else if (aNumber !== -1 && bNumber !== -1) {
                    break
                }
            }
            if (aNumber === -1 || bNumber === -1) {
                return false
            }
            this.elements[bNumber].data[bKey] = this.elements[aNumber].data[aKey];
            return true
        },
    },


    state: () => ({
        // 流程图节点
        elements: [],
        // 元素信息列表
        allElementList: [
            // 文件读取
            {
                type: "数据采集",
                englishName: "DataAcquisition",
                children: [
                    {title: '上传表格', name: "AddFile", icon: h(FileStorage), isShow: true},
                    {title: '数据库', name: "Database", icon: h(DataBase), isShow: true},
                    {title: 'API接口', name: "Api", icon: h(Api1), isShow: true},
                    {title: '网页URL', name: "WebUrl", icon: h(ApplicationWeb), isShow: true},
                ]
            },
            // 文本分析
            {
                type: "文本分析",
                englishName: "TextProcessing",
                children: [
                    {title: '上传文档', name: "TextUpload", icon: h(TextAnnotationToggle), isShow: true},
                    {title: '中文分词', name: "ChineseParticiple", icon: h(TextHighlight), isShow: true},
                    {title: '关键词提取', name: "KeyWordsExtraction", icon: h(PointerText), isShow: true},
                    {title: '关键词分析', name: "KeyWords", icon: h(SearchLocate), isShow: false},
                    {title: '词频统计', name: "WordFrequency", icon: h(Equalizer), isShow: true},
                    {title: '文本清洗', name: "TextCleaning", icon: h(ChangeCatalog), isShow: true},
                ]
            },
            // 数据清洗组件
            {
                type: "数据清洗组件",
                englishName: "DataCleaning",
                children: [
                    {title: '数据清洗', name: "DataCleaning", icon: h(Automatic), isShow: true},
                    {title: '转换数据类型', name: "ConvertDataType", icon: h(GraphicalDataFlow), isShow: true},
                    {title: '删除重复', name: "DeleteDuplicate", icon: h(Carbon), isShow: false},
                    {title: '去除空值', name: "DeleteNullData", icon: h(ContainerRegistry), isShow: false},
                    {title: '填补缺失', name: "FillMissingData", icon: h(DataBlob), isShow: true},
                    {title: '表清洗', name: "TableCleaning", icon: h(DataTable), isShow: true},
                    {title: '编辑列', name: "EditColumn", icon: h(Edit), isShow: true},
                    {title: '删除行', name: "DeleteRow", icon: h(RowDelete), isShow: true},
                ]
            },
            // 数据加工
            {
                type: "数据加工",
                englishName: "DataProcessing",
                children: [
                    {title: '列合并', name: "ColumnCombined", icon: h(Insert), isShow: true},
                    {title: '数据拆分', name: "DataSplit", icon: h(SplitScreen), isShow: true},
                    {title: '数据提取', name: "DataExtraction", icon: h(DataSet), isShow: true},
                    {title: '添加前后缀', name: "AddPrefixSuffix", icon: h(PauseFilled), isShow: true},
                    {title: '行列转换', name: "RowColumnConversion", icon: h(DataShare), isShow: true},
                    {title: '数据替换', name: "DataReplaced", icon: h(DataReference), isShow: true},
                    {title: '数据合并', name: "DataCombined", icon: h(Compare), isShow: true},
                    {title: '逻辑判断', name: "LogicalJudgment", icon: h(AiStatus), isShow: true},
                    {title: '分类计算', name: "ClassificationCalculation", icon: h(Calculation), isShow: true},
                    {title: '排序', name: "DataSort", icon: h(SortDescending), isShow: true},
                ]
            },
            // 数据模型
            {
                type: "数据模型",
                englishName: "DataModel",
                children: [
                    {title: '销售量预测模型', name: "ArimaModel", icon: h(ChartLine), isShow: true},
                    {title: '用户分层模型', name: "UserStratificationModel", icon: h(UserMilitary), isShow: true},
                    {title: '漏斗模型', name: "FunnelModel", icon: h(DistributeVerticalTop), isShow: true},
                    {title: '招聘漏斗模型', name: "FunnelBModel", icon: h(DataFunnel24Filled), isShow: true},
                ]
            },
            // 数据展示
            {
                type: "可视化图表",
                englishName: "Chart",
                children: [
                    {title: '柱状图表', name: "BarChart", icon: h(ChartClusterBar), isShow: true},
                    {title: '折线图表', name: "LineChart", icon: h(ChartMultiLine), isShow: true},
                    {title: '条形图表', name: "StripChart", icon: h(ChartBar), isShow: true},
                    {title: '雷达图表', name: "RadarChart", icon: h(ChartRadar), isShow: true},
                    {title: '词云图表', name: "WordCloudChart", icon: h(WordCloud), isShow: true},
                    {title: '面积图表', name: "AreaChart", icon: h(ChartArea), isShow: true},
                    {title: '直方图表', name: "HistogramChart", icon: h(ChartHistogram), isShow: true},
                    {title: '饼状图表', name: "PieChart", icon: h(ChartPie), isShow: true},
                    {title: '数据表', name: "DataDisplay", icon: h(Apps), isShow: true},
                    //
                    {title: '散点图', name: "ChartScatter", icon: h(ChartScatter), isShow: true},
                    {title: '气泡图', name: "ChartBubble", icon: h(ChartBubble), isShow: true},
                    {title: '树状图', name: "ChartTreemap", icon: h(ChartTreemap), isShow: true},
                    {title: '色块图', name: "CalendarHeatMap", icon: h(CalendarHeatMap), isShow: true},
                    {title: '漏斗图', name: "FunnelChart", icon: h(DataFunnel24Regular), isShow: true},
                ]
            },
            // 数据展示
            {
                type: "答案评分",
                englishName: "score",
                children: [
                    {title: '答案评分', name: "Score", icon: h(ArrowAnnotation), isShow: true},
                    {title: '图片评分', name: "PictureScore", icon: h(ApprovalsApp20Regular), isShow: true},
                ]
            },
        ]
    }),

    getters: {
        // 传入节点类型  获取节点模板
        getElementTemplate: () => (type, x = 10, y = 10) => {
            let position = {x: x, y: y}
            let isPass = (type, whitelist, connection) => {
                const typeEnum = {
                    "入口": "inlet",
                    "出口": "export"
                }
                if (connection.targetHandle.split("-")[1] === typeEnum[type]) {
                    // 判断线的另一边是否为出口或者入口 ( 与自身相反 )
                    return false
                }
                if (whitelist[0] === "") {
                    // 白名单不做限制
                    return true
                }
                if (type === "入口") {
                    // 判断是否在白名单内
                    return whitelist.indexOf(connection.sourceHandle) !== -1;
                } else if (type === "出口") {
                    // 判断是否在白名单内
                    return whitelist.indexOf(connection.targetHandle) !== -1;
                }
            }
            let elementTemplates = {
                DeleteDuplicate: {
                    id: uuid(),
                    type: 'DeleteDuplicate',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                FunnelModel: {
                    id: uuid(),
                    type: 'FunnelModel',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                FunnelBModel: {
                    id: uuid(),
                    type: 'FunnelBModel',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DeleteRow: {
                    id: uuid(),
                    type: 'DeleteRow',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                FunnelChart: {
                    id: uuid(),
                    type: 'FunnelChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                EditColumn: {
                    id: uuid(),
                    type: 'EditColumn',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DataSort: {
                    id: uuid(),
                    type: 'DataSort',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                TableCleaning: {
                    id: uuid(),
                    type: 'TableCleaning',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                TextUpload: {
                    id: uuid(),
                    type: 'TextUpload',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: ''
                    }
                },
                ClassificationCalculation: {
                    id: uuid(),
                    type: 'ClassificationCalculation',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: ''
                    }
                },
                TextCleaning: {
                    id: uuid(),
                    type: 'TextCleaning',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: ''
                    }
                },
                KeyWordsExtraction: {
                    id: uuid(),
                    type: 'KeyWordsExtraction',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: ''
                    }
                },
                ChineseParticiple: {
                    id: uuid(),
                    type: 'ChineseParticiple',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        text: '',
                        data: ''
                    }
                },
                Score: {
                    id: uuid(),
                    type: 'Score',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 0,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                PictureScore: {
                    id: uuid(),
                    type: 'PictureScore',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 0,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                UserStratificationModel: {
                    id: uuid(),
                    type: 'UserStratificationModel',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {},
                        fatherData:{},
                    }
                },
                ArimaModel: {
                    id: uuid(),
                    type: 'ArimaModel',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DataCombined: {
                    id: uuid(),
                    type: 'DataCombined',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 2,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {},
                        data1: {},
                        data2: {},
                    }
                },
                DataSplit: {
                    id: uuid(),
                    type: 'DataSplit',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                LogicalJudgment: {
                    id: uuid(),
                    type: 'LogicalJudgment',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                ColumnCombined: {
                    id: uuid(),
                    type: 'ColumnCombined',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                AddPrefixSuffix: {
                    id: uuid(),
                    type: 'AddPrefixSuffix',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DataReplaced: {
                    id: uuid(),
                    type: 'DataReplaced',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DeleteNullData: {
                    id: uuid(),
                    type: 'DeleteNullData',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DataExtraction: {
                    id: uuid(),
                    type: 'DataExtraction',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                FillMissingData: {
                    id: uuid(),
                    type: 'FillMissingData',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                RowColumnConversion: {
                    id: uuid(),
                    type: 'RowColumnConversion',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                // 图表组件
                BarChart: {
                    id: uuid(),
                    type: 'BarChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                LineChart: {
                    id: uuid(),
                    type: 'LineChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                StripChart: {
                    id: uuid(),
                    type: 'StripChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                RadarChart: {
                    id: uuid(),
                    type: 'RadarChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                WordCloudChart: {
                    id: uuid(),
                    type: 'WordCloudChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                AreaChart: {
                    id: uuid(),
                    type: 'AreaChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                HistogramChart: {
                    id: uuid(),
                    type: 'HistogramChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                PieChart: {
                    id: uuid(),
                    type: 'PieChart',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                ChartScatter: {
                    id: uuid(),
                    type: 'ChartScatter',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                ChartBubble: {
                    id: uuid(),
                    type: 'ChartBubble',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                ChartTreemap: {
                    id: uuid(),
                    type: 'ChartTreemap',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                CalendarHeatMap: {
                    id: uuid(),
                    type: 'CalendarHeatMap',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DataDisplay: {
                    id: uuid(),
                    type: 'DataDisplay',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                // 文件读取
                AddFile: {
                    id: uuid(),
                    type: 'AddFile',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 0,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                Database: {
                    id: uuid(),
                    type: 'Database',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 0,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                Api: {
                    id: uuid(),
                    type: 'Api',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 0,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                WebUrl: {
                    id: uuid(),
                    type: 'WebUrl',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 0,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                KeyWords: {
                    id: uuid(),
                    type: 'KeyWords',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                WordFrequency: {
                    id: uuid(),
                    type: 'WordFrequency',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                DataCleaning: {
                    id: uuid(),
                    type: 'DataCleaning',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
                ConvertDataType: {
                    id: uuid(),
                    type: 'ConvertDataType',
                    position: position,
                    class: 'node',
                    // 最大入口数
                    maxEntryNumber: 1,
                    // 最大出口数
                    maxExportNumber: 1000,
                    isValidSourcePos: (connection) => {
                        // 入口柄
                        const whitelist = [""] // 白名单
                        return isPass("入口", whitelist, connection)
                    },
                    isValidTargetPos: (connection) => {
                        // 出口柄
                        const whitelist = [""] // 白名单
                        return isPass("出口", whitelist, connection)
                    },
                    data: {
                        data: {}
                    }
                },
            }
            return elementTemplates[type]
        }
    },
})
